package com.ATM;

import java.util.ArrayList;
import java.util.Objects;
import java.util.Random;
import java.util.Scanner;

public class ATM {
    private ArrayList<Account>accounts=new ArrayList<>();
    Scanner sc=new Scanner(System.in);
    private Account loginAcc;
    //启动ATM系统 展示欢迎界面
    public void start(){
        testAccount();//初始化一个账户1用于测试
        testAccount2();//初始化一个账户2用于测试

        while (true) {
            System.out.println("=========系统界面========");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");


            System.out.println("3.结束应用");
            System.out.println("请您选择");
            int command= sc.nextInt();
            switch (command) {
                case 1 -> login();
                case 2 -> creatAccount();
                case 3 -> {
                    return;
                }
                default -> System.out.println("请重新选择");
            }
        }
    }

    private void login(){       //完成用户登录操作
        System.out.println("===系统登录===");
        //先判断存不存在
        if (accounts.size()==0){
            System.out.println("当前系统中无任何账户，请先开户");
            return;
        }
        //有账户
        while (true) {
            System.out.println("请您输入您的登录卡号");
            String cardId= sc.next();
            //判断卡号是否存在
            Account acc=getAccountByIdCd(cardId);
            if (acc==null){
                System.out.println("您输入的卡号不存在");
                return;
            }else
            {
                System.out.println("请你输入密码");
                while (true) {
                    String passWard=sc.next();
                    if(acc.getPassWord().equals(passWard)){
                        loginAcc=acc;//确认当前账户
                        System.out.println("恭喜您，"+acc.getUserName()+"成功登录");
                        //成功进入
                        //操作界面
                        showUserCommand();
                        return;//回到首页
                     }else {
                        System.out.println("您输入的密码不正确，请重新输入");

                    }
                }
            }
        }
    }


    //操作界面
    private void showUserCommand(){
        while (true) {
        System.out.println("=======操作界面======");
        System.out.println(loginAcc.getUserName()+"您可以使用以下功能进行操作");
        System.out.println("1.查询");
        System.out.println("2.存款");
        System.out.println("3.取款");
        System.out.println("4.转账");
        System.out.println("5.密码修改");
        System.out.println("6.退出");
        System.out.println("7.注销当前账户");
            int command=sc.nextInt();
            switch (command){
                case 1 :    //查询
                    showLoginAccount();
                    System.out.println("按任意键继续");
                    sc.nextInt();
                    break;
                case 2 :    //存款
                    depositMoney();
                    System.out.println("按任意键继续");
                    sc.nextInt();
                    break;
                case 3 :    //取款
                    drawMoney();
                    System.out.println("按任意键继续");
                    sc.nextInt();
                    break;
                case 4 :    //转账
                    transferMoney();
                    break;
                case 5:     //密码修改
                    boolean com= changePassWard();
                    if(com){
                        return;
                    }else {
                        break;
                    }
                case 6 :    //退出
                    System.out.println(loginAcc.getUserName()+"您退出系统成功");
                    System.out.println("按任意键继续");
                    sc.nextInt();
                    return;
                case 7://注销;
                    boolean del=deleteAccount();
                   if(del){
                       return;
                   }else {
                       break;
                   }
                default :
                    System.out.println("没有该命令，请重新选择");
                    System.out.println("按任意键继续");
                    sc.nextInt();
            }
        }

    }

    private boolean changePassWard() {
        System.out.println("=====密码修改系统=====");
        System.out.println("请输入原密码");
        String passWard= sc.next();
        if(passWard.equals(loginAcc.getPassWord())){//确认是否原主人
            while (true) {
                System.out.println("请您输入您的新密码");
                String passWord= sc.next();
                System.out.println("请您确认您的新密码");
                String okPassWord= sc.next();
                if(okPassWord.equals(passWord)){
                    loginAcc.setPassWord(okPassWord);
                    return true;
                }else {
                    System.out.println("您输入的2次密码不一致，请您重新输入");
                }
            }
        }else {
            System.out.println("您输入的原密码有错误");
            return false;
        }

    }

    private boolean deleteAccount() {
        while (true) {
            System.out.println("=====销户系统=====");
            //1.确认是否销户
            if(loginAcc.getMoney()==0) {
                System.out.println("确定销户吗？y/n");
                String command = sc.next();
                if (Objects.equals(command, "y")) {
                    accounts.remove(loginAcc);
                    System.out.println("恭喜您销户成功");
                    return true;
                }
                if (Objects.equals(command, "n")) {
                    System.out.println("您取消了销户操作");
                    return false;
                }
                System.out.println("您输入的指令错误");
            }else {
                System.out.println("您当前的账户余额不为0");
                return false;
            }
        }
    }

    private void transferMoney() {  //**转账
        System.out.println("=====转账系统=====");
        //1.判断账户数量是否满足
        if(accounts.size()<2){
            System.out.println("当前系统中只有你一个账户");
            return;
        }
        //2.判断账户是否有钱
        if(loginAcc.getMoney()==0){
            System.out.println("您的余额不足");
        }
        //3.可以开始转账
        while (true) {
            System.out.println("请你输入对方账户");
            String card= sc.next();
            //4.判断账户是否正确
            Account acc= getAccountByIdCd(card);
            if(acc==null){
                System.out.println("您输入的账户不存在");
                System.out.println("是否继续？按任意键继续，按0退出");
                int command= sc.nextInt();
                if (command==0){
                    return;
                }
            }else {
                //5.账户存在，让用户认证
                while (true) {
                    System.out.println("请输入对方姓名");
                    String name= sc.next();
                    if(name.equals(acc.getUserRealName())){
                        System.out.println("请您输入转账金额");
                        double money= sc.nextDouble();
                        if(loginAcc.getMoney()>=money){
                            //5.1可以进行转账
                            loginAcc.setMoney(loginAcc.getMoney()-money);
                            acc.setMoney(acc.getMoney()+money);
                            System.out.println("转账成功，您的余额为"+loginAcc.getMoney());
                            return;
                        }else {
                            System.out.println("您的余额不足。您的余额为"+loginAcc.getMoney());
                            System.out.println("是否继续？按任意键继续，按0退出");
                            int command= sc.nextInt();
                            if (command==0){
                                return;
                            }
                        }

                    }else {
                        System.out.println("您输入的姓名不符");
                        System.out.println("是否继续？按任意键继续，按0退出");
                        int command= sc.nextInt();
                        if (command==0){
                            return;
                        }
                    }
                }
            }

        }

    }

    private void  depositMoney(){  //存款
        System.out.println("======存款界面======");
        System.out.println("请您输入存款金额");
        double money= sc.nextDouble();
        //更新当前账户余额
        loginAcc.setMoney(loginAcc.getMoney()+money);
        System.out.println("恭喜您，存款成功");
        System.out.println(loginAcc.getUserName()+"，您现在余额为："+loginAcc.getMoney());
    }

    private void  drawMoney(){  //取款
        System.out.println("======取款界面======");
        if(loginAcc.getMoney()<100){//判断金额是否大于100
            System.out.println("您的账户余额不足100，不允许提款");
            return;
        }
        //更新当前账户余额
        while (true) {
            System.out.println("请您输入取款金额");//取款金额
            double money= sc.nextDouble();
            if(money<= loginAcc.getMoney()){
                if(money> loginAcc.getLimit()){
                    System.out.println("您的取款金额超过限额。您的限额为"+loginAcc.getLimit());
                    System.out.println("请重新输入");
                }else {
                    loginAcc.setMoney(loginAcc.getMoney() - money);
                    System.out.println("恭喜您，取款成功");
                    System.out.println(loginAcc.getUserName() + "，您现在余额为：" + loginAcc.getMoney());
                    return;
                }
            }else {
                System.out.println(loginAcc.getUserName()+"，您的余额不足。");
                System.out.println(loginAcc.getUserName()+"，您现在余额为："+loginAcc.getMoney());
                System.out.println("是否继续？按任意键继续，按0退出");
                int command= sc.nextInt();
                if(command==0){
                    return;
                }
            }
        }

    }

    private void showLoginAccount(){ //展示账户
        System.out.println("=====您的账户信息如下=====");
        System.out.println("卡号:"+loginAcc.getCardId());
        System.out.println("户主:"+loginAcc.getUserName());
        System.out.println("性别:"+loginAcc.getSdx());
        System.out.println("余额:"+loginAcc.getMoney());
        System.out.println("限额:"+loginAcc.getLimit());
    }

    private void creatAccount(){  //完成用户开户操作，建议私有
        System.out.println("==系统开户操作==");
        //创建账号对象
        Account acc=new Account();
        //引导用户填相应信息
        System.out.println("请输入您的账户名称");
        acc.setUserName(sc.next());
        System.out.println("输入您的性别");
        while (true) {
            char sex=sc.next().charAt(0);
            if(sex=='男'||sex=='女') {
                acc.setSdx(sex);
                break;
            }
            else {
                System.out.println("您输入的信息有误，只能填男或女");
            }
        }

        while (true) {
            System.out.println("请您输入您的密码");
            String passWord= sc.next();
            System.out.println("请您确认您的密码");
            String okPassWord= sc.next();
            if(okPassWord.equals(passWord)){
                acc.setPassWord(okPassWord);
                break;
            }else {
                System.out.println("您输入的2次密码不一致，请您确认");
            }
        }

        System.out.println("请您输入您的取现额度");
        double limit = sc.nextDouble();
        acc.setLimit(limit);

        //自动生产卡号
        String cardId=creatCardId(8);
        acc.setCardId(cardId);
        //加入到集合账户
        accounts.add(acc);
        System.out.println("恭喜"+acc.getUserName()+"完成开户");
        System.out.println("您的卡号是"+acc.getCardId());
    }


    private String creatCardId(int n){  //返回一个卡号，且不与其他账户重复
        while (true) {
            //1.初始化
            String cardId="";
            Random r=new Random();
            //2.产生数字
            for (int i = 0; i < n; i++) {
                int date=r.nextInt(10);
                cardId+=date;
            }
            //3.判断账户是否重复
            Account acc=getAccountByIdCd(cardId);
            if(acc==null){
                return cardId;
            }
        }
    }


    private Account getAccountByIdCd(String cardId){   //根据卡号查询
        for (int i = 0; i < accounts.size(); i++) {
            Account acc=accounts.get(i);
            if(acc.getCardId().equals(cardId)){
                return acc;
            }
        }
        return  null;
    }

    private void testAccount(){  //该账户用于测试
        //1.创建账户
        Account acc=new Account();
        //2.设置账户名称
        acc.setUserName("吴智海");
        //3.性别
        acc.setSdx('男');
        //4.密码123456
        acc.setPassWord("123456");
        //5.设置取现额度500
        acc.setLimit(500);
        //6.卡号11111111
        acc.setCardId("12345678");
        //7.设置初始金额5000
        acc.setMoney(0);
        //8.账户入库
        accounts.add(acc);
    }

    private void testAccount2(){  //该账户2用于测试
        //1.创建账户
        Account acc=new Account();
        //2.设置账户名称
        acc.setUserName("吴雨欣");
        //3.性别
        acc.setSdx('女');
        //4.密码123456
        acc.setPassWord("123456");
        //5.设置取现额度500
        acc.setLimit(500);
        //6.卡号11111111
        acc.setCardId("23456789");
        //7.设置初始金额5000
        acc.setMoney(5000);
        //8.账户入库
        accounts.add(acc);
    }

    //返回一个卡号，且不与其他账户重
}


